import axios from 'axios';
import store from '@/store/index.js';

// 设置网络请求的基地址
const instance = axios.create({
    baseURL: 'http://toutiao.itheima.net/'
})

// 把所有通过instance发送的请求进行拦截
instance.interceptors.request.use(function (config) {
    // 参数config包含了本次请求的所有的配置信息 给config加什么，请求时就有什么
    // 所以我们给请求头加token，就加在headers中
    // console.log(config);
    if (store.state.tokenObj.token) {
        config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }
    return config
}, function (error) { //请求错误时处理的函数
    return Promise.reject(error)
})

import router from '@/router/index.js';
import { Toast } from 'vant';

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
}, async function (error) {
    if (error.response.status == 401) {
        try {
            // 写代码发请求，利用refresh_token去请求一个新的token
            let res = await axios({
                url: 'http://toutiao.itheima.net/v1_0/authorizations',
                method: 'put',
                headers: {
                    Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
                }
            })
            // 请求到数据后，把新的token保存到vuex和localStoryage中
            store.commit('saveToken', {
                token: res.data.data.token,
                refresh_token: store.state.tokenObj.refresh_token
            })
            // 在把新的token保存后，把原来失败的请求再发一次，拿到结果后返回出数据
            return await instance(error.config)
        } catch {
            // 当代码进到这里，说明连refresh_token都过期了
            // 此时就应该挡回登录页
            Toast.fail('登录状态已失效，请重新登陆')
            router.push('/login')
        }
    }else{
        // 对响应错误做点什么
        return Promise.reject(error);
    }
});

// 把请求基地址暴露出去，以便全局调用
export default instance